]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
gdm: Disconnect user verifier signals on destruction and verification failed
authorMarco Trevisan (Treviño) <mail@3v1n0.net>
Tue, 2 Feb 2021 14:08:10 +0000 (15:08 +0100)
committerMarge Bot <marge-bot@gnome.org>
Fri, 12 Feb 2021 20:26:00 +0000 (20:26 +0000)
When a verification session has failed we may want to wait for the user
to have completed all the waiting queries and to have read all the
incoming messages, however during such time an user verifier should
not be allowed to queue further messages to the UI, as we're about to
completely stop the identification or start a new one.

Unfortunately this is not true because we're still connected to the
identifier signals, and so we may still show messages.
This is particularly true when using the fingerprint PAM module as it
may restart the authentication while we're in the process of stopping
it.

So, keep track of all the signals we've connected to, and disconnect on
verification failed and during cancel/clear operations.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1622>

js/gdm/util.js

index 048e2bf5e21badeaea0ce07527c332137f9ab5ff..587a2c94155d9234c75dd44d9c21955d1710af15 100644 (file)
@@ -224,6 +224,7 @@ var ShellUserVerifier = class {
 
     _clearUserVerifier() {
         if (this._userVerifier) {
+            this._disconnectSignals();
             this._userVerifier.run_dispose();
             this._userVerifier = null;
         }
@@ -431,13 +432,31 @@ var ShellUserVerifier = class {
     }
 
     _connectSignals() {
-        this._userVerifier.connect('info', this._onInfo.bind(this));
-        this._userVerifier.connect('problem', this._onProblem.bind(this));
-        this._userVerifier.connect('info-query', this._onInfoQuery.bind(this));
-        this._userVerifier.connect('secret-info-query', this._onSecretInfoQuery.bind(this));
-        this._userVerifier.connect('conversation-stopped', this._onConversationStopped.bind(this));
-        this._userVerifier.connect('reset', this._onReset.bind(this));
-        this._userVerifier.connect('verification-complete', this._onVerificationComplete.bind(this));
+        this._disconnectSignals();
+        this._signalIds = [];
+
+        let id = this._userVerifier.connect('info', this._onInfo.bind(this));
+        this._signalIds.push(id);
+        id = this._userVerifier.connect('problem', this._onProblem.bind(this));
+        this._signalIds.push(id);
+        id = this._userVerifier.connect('info-query', this._onInfoQuery.bind(this));
+        this._signalIds.push(id);
+        id = this._userVerifier.connect('secret-info-query', this._onSecretInfoQuery.bind(this));
+        this._signalIds.push(id);
+        id = this._userVerifier.connect('conversation-stopped', this._onConversationStopped.bind(this));
+        this._signalIds.push(id);
+        id = this._userVerifier.connect('reset', this._onReset.bind(this));
+        this._signalIds.push(id);
+        id = this._userVerifier.connect('verification-complete', this._onVerificationComplete.bind(this));
+        this._signalIds.push(id);
+    }
+
+    _disconnectSignals() {
+        if (!this._signalIds || !this._userVerifier)
+            return;
+
+        this._signalIds.forEach(s => this._userVerifier.disconnect(s));
+        this._signalIds = [];
     }
 
     _getForegroundService() {
@@ -581,6 +600,8 @@ var ShellUserVerifier = class {
             (this._reauthOnly ||
              this._failCounter < this._settings.get_int(ALLOWED_FAILURES_KEY));
 
+        this._disconnectSignals();
+
         if (canRetry) {
             if (!this.hasPendingMessages) {
                 this._retry();